package com.xuecheng.media.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;
import com.xuecheng.model.PageParams;
import com.xuecheng.model.PageResult;
import com.xuecheng.model.RestResponse;
import io.minio.errors.*;

import java.io.File;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * <p>
 * 媒资信息 服务类
 * </p>
 *
 * @author itcast
 * @since 2023-03-27
 */
public interface MediaFilesService extends IService<MediaFiles> {
    PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 将文件上传到MinIO并将数据保存到数据库
     * @param companyID 机构ID
     * @param uploadFileParamsDto 前端上传过来的文件相关信息
     * @param FilePath 文件路径
     * @param objectName 上传到MinIO的ObjectName
     * @return
     */
    UploadFileResultDto uploadFile(long companyID, UploadFileParamsDto uploadFileParamsDto, String FilePath , String objectName);


    /**
     * 将文件信息保存到数据库
     * @param companyID
     * @param bucket
     * @param fileMD5
     * @param objectName
     * @param paramsDto
     * @return
     */
    MediaFiles SaveFileData(long companyID , String bucket , String fileMD5 , String objectName , UploadFileParamsDto paramsDto);


    /**
     * 上传文件前检查文件是否存在
     * @param md5
     * @return
     */
    RestResponse<Boolean> FileUploadCheck(String md5);


    /**
     * 检查当前上传的分块文件是否存在
     * @param md5
     * @param nowFile
     * @return
     */
    RestResponse<Boolean> UploadBlockFileCheck(String md5 , int nowFile);


    /**
     * 上传分块文件
     * @param file
     * @param md5
     * @param nowFile
     * @return
     */
    RestResponse UploadBlockFile(String file , String md5 , int nowFile);


    /**
     * 合并文件
     * @param companyID 机构id
     * @param fileMD5 文件的MD5值
     * @param FileCount 分块文件的总条数
     * @param uploadFileParamsDto 保存到数据库的数据
     * @return
     */
    RestResponse MergedBranch(long companyID , String fileMD5 , int FileCount , UploadFileParamsDto uploadFileParamsDto);


    /**
     *
     * @param bucket 桶
     * @param ObjectName MinIO文件路径
     * @return  返回File对象，方便删除零时文件
     */
    File DownloadMinIOFile(String bucket , String ObjectName);


    /**
     * 将文件上传到MinIO
     * @param bucket 桶
     * @param objectName  文件名称
     * @param ContentType  文件类型
     * @param FilePath 文件的地址
     */
    public boolean LoadFileMinIo(String bucket , String objectName , String ContentType , String FilePath);

    /**
     * 获取文件的contentType
     * @param FileExtension 文件的后缀名
     * @return
     */
    String GetFileContentType(String FileExtension);

    /**
     * 根据文件ID取出查询文件信息
     * @param mediaID
     * @return
     */
    MediaFiles GetMediaFilesByID(String mediaID);
}
